package com.gas.activemq.nio;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
import java.io.IOException;

/**
 * @author guoshoudu
 * @version 1.0
 * @description
 * @date 2021/6/22 4:06 下午
 */
public class JmsConsumer {
    public static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61608";
    public static final String QUEUE_NAME = "nioauto";
    public static void main(String[] args) throws JMSException, IOException {
        System.out.println("***我是2号消费者");
        //1创建连接工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
        // 2 通过连接工厂连接 connection  和 启动
        Connection connection = activeMQConnectionFactory.createConnection();
        connection.start();
        // 3 创建回话  session
        // 两个参数，第一个事务， 第二个签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 4 创建目的地 （两种 ： 队列/主题   这里用队列）
        Queue queue = session.createQueue(QUEUE_NAME);
        // 5 创建消息的消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);
//   1、     //同步堵塞方式receive ：订阅者或者接受者调用MessageConsumer的receive()方法来接受消息，receive方法在能够接收到消息之前（或超时之前）将一直堵塞。
//        while(true){
//            // 这里是 TextMessage 是因为消息发送者是 TextMessage ， 接受处理的
//            // 也应该是这个类型的消息
//            TextMessage message = (TextMessage)messageConsumer.receive(4000L);
//            if (null != message){
//                System.out.println("****消费者的消息："+message.getText());
//            }else {
//                break;
//            }
//        }
//        messageConsumer.close();
//        session.close();
//        connection.close();

        //2、通过监听的方式来消息
        //异步非阻塞方式：订阅者或者接受者调用MessageConsumer的setMessageListener 注册一个消息监听器，
        // 当消息到达后，系统自动调用监听器MessageListener的onMessage(Message message)方法
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if (null!=message &&message instanceof TextMessage){
                TextMessage textMessage= (TextMessage) message;
                    try {
                        System.out.println("****消费者的消息："+textMessage.getText());
//                        System.out.println("****消费者的消息属性："+textMessage.getStringProperty("c01"));

                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
//                if (null!=message &&message instanceof MapMessage){
//                    MapMessage mapMessage= (MapMessage) message;
//                    try {
//                        System.out.println("****消费者的消息："+mapMessage.getString("k1"));
//                    } catch (JMSException e) {
//                        e.printStackTrace();
//                    }
//                }
            }
        });
        System.in.read();
        messageConsumer.close();
        session.close();
        connection.close();

        /**
         * 1 先生产，只启动1号消费者，问题：1号消费着能消费消息吗？
         * Y
         * 2 先生产， 先启动1号消费者在启动2号消费者，问题： 2号消费着还能消费消息吗？
         *  2.1 1号可以消费   Y
         *  2.2 2号可以消费吗？  N
         *
         * 3 先启动2个消费者，在生产6条消息，请问：消费情况如何？
         *  3。1 2个消费者 ，都要6条
         *  3。2 先到先得，6条全给一个来
         *  3。3 一人一半 Y
         */
    }
}
